package com.zhiwen.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zhiwen.domain.entity.Question;
import com.zhiwen.domain.entity.User;
import com.zhiwen.domain.vo.QuestionVO;
import com.zhiwen.domain.vo.UserVO;

import java.util.List;
import java.util.Map;

/**
 * 搜索服务接口
 */
public interface SearchService {

    /**
     * 搜索问题
     *
     * @param keyword 关键词
     * @param page 分页参数
     * @return 分页结果
     */
    Page<QuestionVO> searchQuestions(String keyword, Page<Question> page);

    /**
     * 搜索问题（支持排序方式）
     *
     * @param keyword 关键词
     * @param page 分页参数
     * @param sort 排序方式(1-默认，2-最新，3-最热)
     * @return 分页结果
     */
    Page<QuestionVO> searchQuestions(String keyword, Page<Question> page, Integer sort);

    /**
     * 搜索用户
     *
     * @param keyword 关键词
     * @param page 分页参数
     * @return 分页结果
     */
    Page<UserVO> searchUsers(String keyword, Page<User> page);

    /**
     * 综合搜索
     *
     * @param keyword 关键词
     * @param current 当前页码
     * @param size 每页数量
     * @return 搜索结果
     */
    Map<String, Object> searchAll(String keyword, Integer current, Integer size);

    /**
     * 获取热门搜索关键词
     *
     * @param limit 返回数量
     * @return 热门关键词列表
     */
    List<String> getHotKeywords(Integer limit);

    /**
     * 保存搜索历史
     *
     * @param userId 用户ID
     * @param keyword 关键词
     * @param type 搜索类型(1-问题, 2-用户)
     * @return 是否成功
     */
    boolean saveSearchHistory(Long userId, String keyword, Integer type);

    /**
     * 获取用户搜索历史
     *
     * @param userId 用户ID
     * @param limit 返回数量
     * @return 搜索历史列表
     */
    List<String> getUserSearchHistory(Long userId, Integer limit);

    /**
     * 清空用户搜索历史
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean clearUserSearchHistory(Long userId);

    /**
     * 搜索相关标签
     *
     * @param keyword 关键词
     * @param limit 返回数量
     * @return 相关标签列表
     */
    List<String> searchRelatedTags(String keyword, Integer limit);

    /**
     * 获取搜索建议
     *
     * @param keyword 关键词
     * @param limit 返回数量
     * @return 搜索建议列表
     */
    List<String> getSearchSuggestions(String keyword, Integer limit);

    /**
     * 高级搜索
     *
     * @param keyword 关键词
     * @param tags 标签(多个用逗号分隔)
     * @param userId 用户ID
     * @param startDate 开始日期(yyyy-MM-dd)
     * @param endDate 结束日期(yyyy-MM-dd)
     * @param minViews 最小浏览数
     * @param minAnswers 最小回答数
     * @param page 分页参数
     * @param sort 排序方式(1-默认，2-最新，3-最热，4-最多回答，5-最多点赞)
     * @return 分页结果
     */
    Page<QuestionVO> advancedSearch(String keyword, String tags, Long userId, String startDate,
            String endDate, Integer minViews, Integer minAnswers,
            Page<Question> page, Integer sort);

    /**
     * 清除搜索缓存
     *
     * @param type 缓存类型(1-全部, 2-问题搜索, 3-热词, 4-搜索建议)
     * @return 是否成功
     */
    boolean clearSearchCache(Integer type);
}
